<?php
/**
 * @Author: Wang chunsheng  email:2192138785@qq.com
 * @Date:   2022-09-15 20:35:50
 * @Last Modified by:   Wang chunsheng  email:2192138785@qq.com
 * @Last Modified time: 2022-09-15 20:55:09
 */

namespace common\components;

use yii2mod\enum\helpers\BaseEnum as HelpersBaseEnum;

class BaseEnum extends HelpersBaseEnum
{
    public static function getLabelByName($name): bool|string|null
    {
        $list = self::getConstantsByName();
        if (key_exists($name,$list)) {
            return  self::getLabel($list[$name]);
        }

        return false;
    }

    static function getValueByLabel($label)
    {
        $label = strtoupper($label);
        $list = self::getConstantsByName();
        if (key_exists($label,$list)) {
            return  $list[$label];
        }
        return false;
    }

    /**
     * 获取静态变量的键
     * @param $value
     * @return int|string|null
     * @throws \Exception
     */
    static function getConstantsAsValue($value): int|string|null
    {
        // 尝试获取常量数组，如果发生异常或错误，则抛出异常
        try {
            $constants = self::getConstantsByName();
        } catch (\Exception $e) {
            throw new \Exception("获取常量时发生错误: " . $e->getMessage());
        }

        // 检查是否返回空数组，避免后续的array_search导致错误
        if (empty($constants)) {
            return null; // 或者根据需求返回false，这里选择null以区分空数组和未找到的情况
        }

        // 使用array_search查找匹配项
        $key = array_search($value, $constants);

        // 检查array_search的返回值，如果未找到匹配项，则返回false或null
        if ($key === false) {
            return null; // 或者根据需求返回false，这里保持与前面的一致性
        }

        // 如果允许多值匹配且数组中有多个匹配项，则收集所有匹配项的键
        // 注意：这会改变返回值的类型从单个字符串到数组
        // 如果不希望改变类型，则在此处返回$key即可
        $matchingKeys = '';
        foreach ($constants as $k => $v) {
            if ($v === $value) {
                $matchingKeys = $k;
            }
        }

        // 根据需求，这里可以选择返回单个匹配项的键、所有匹配项的键组成的数组，或者在多值匹配不被允许时返回null
        // 以下是返回单个匹配项或所有匹配项的示例
        return $matchingKeys;
    }

    static function getConstansLists()
    {
        $list = self::getConstantsByName();
        return array_keys($list);
    }

    /**
     * @throws \Exception
     */
    public static function listOptions(): array
    {
        $list = parent::listData();
        $lists = [];
        foreach ($list as $key=> $item) {
            $lists[] = [
              'id'=>$key,
              'label_name'=> self::getConstantsAsValue($key),
              'value'=>$key,
              'text'=>$item,
              'label'=>$item,
              'name'=>$item
            ];
        }
        return $lists; // TODO: Change the autogenerated stub
    }
}
